﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Reflection;
using BeanboxSoftware.BeanProxy.Internals;

namespace BeanboxSoftware.BeanProxy
{
  //3.5 doesn't have 5 param funcs/actions
  /// <summary>
  /// Extends System.Action to include a 5 parameter type
  /// </summary>
  /// <typeparam name="T1">type 1</typeparam>
  /// <typeparam name="T2">type 2</typeparam>
  /// <typeparam name="T3">type 3</typeparam>
  /// <typeparam name="T4">type 4</typeparam>
  /// <param name="p1">parameter 1</param>
  /// <param name="p2">parameter 2</param>
  /// <param name="p3">parameter 3</param>
  /// <param name="p4">parameter 4</param>
  /// <returns></returns>
  public delegate void Action<T1, T2, T3, T4, T5>(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5);

  /// <summary>
  /// Holds configuration for an Action
  /// </summary>
  public class ActionConfig : MethodConfig<Action>
  {
    public ActionConfig(MethodConfig access) : base(access) { }
  }
  /// <summary>
  /// Holds configuration for an Action&lt;T1&gt;
  /// </summary>
  public class ActionConfig<T1> : MethodConfig<Action<T1>, T1>
  {
    public ActionConfig(MethodConfig access) : base(access) { }
  }
  /// <summary>
  /// Holds configuration for an Action&lt;T1, T2&gt;
  /// </summary>
  public class ActionConfig<T1, T2> : MethodConfig<Action<T1, T2>, T1, T2>
  {
    public ActionConfig(MethodConfig access) : base(access) { }
  }
  /// <summary>
  /// Holds configuration for an Action&lt;T1, T2, T3&gt;
  /// </summary>
  public class ActionConfig<T1, T2, T3> : MethodConfig<Action<T1, T2, T3>, T1, T2, T3>
  {
    public ActionConfig(MethodConfig access) : base(access) { }
  }
  /// <summary>
  /// Holds configuration for an Action&lt;T1, T2, T3, T4&gt;
  /// </summary>
  public class ActionConfig<T1, T2, T3, T4> : MethodConfig<Action<T1, T2, T3, T4>, T1, T2, T3, T4>
  {
    public ActionConfig(MethodConfig access) : base(access) { }
  }
  /// <summary>
  /// Holds configuration for an Action&lt;T1, T2, T3, T4, T5&gt;
  /// </summary>
  public class ActionConfig<T1, T2, T3, T4, T5> : MethodConfig<Action<T1, T2, T3, T4, T5>, T1, T2, T3, T4, T5>
  {
    public ActionConfig(MethodConfig access) : base(access) { }
  }
}
